\section{Shell 基础操作}

本节介绍常用的 Shell 命令及其组合使用方法。
\subsection{新建文件夹}

\begin{questionbox}
    在 /tmp 下新建一个名为 missing 的文件夹。
\end{questionbox}

在这里我们使用 \texttt{mkdir}命令完成：
\begin{lstlisting}[caption={创建文件夹}]
mkdir tmp #在当前目录下创建一个名为tmp的目录
mkdir tmp/missing #在tmp目录下新建一个名为missing的目录
\end{lstlisting}

具体操作如图\ref{fig:新建文档}：
\begin{figure}[H]
	\centering
	\includegraphics[width=\linewidth]{assets/images/空白文档.png}
	\caption{新建一个空白文档}
	\label{fig:新建文档}
\end{figure}
首先通过\texttt{ls}指令我们查看到当前目录下是没有tmp目录的，然后我们按照上面的命令操作。最后通过\texttt{ls}和\texttt{ls tmp}命令查看，发现完成了我们的目的。

\subsection{使用man命令查看使用手册}
\begin{questionbox}
    使用man命令查看 \texttt{touch}和\texttt{chmod}的使用手册
\end{questionbox}
在这里我们使用如下命令：
\begin{lstlisting}
    man touch
    man chmod
\end{lstlisting}
具体结果如图\ref{fig:touch使用手册}和图\ref{fig:chmod使用手册}
\begin{figure}[htb]
	\centering
	\begin{minipage}{0.48\linewidth}
		\centering
		\includegraphics[width=\linewidth]{assets/images/屏幕截图 2025-09-05 114937.png}
		\caption{touch使用手册}
		\label{fig:touch使用手册}
	\end{minipage} \hfill
	\begin{minipage}{0.48\linewidth}
		\centering
		\includegraphics[width=\linewidth]{assets/images/屏幕截图 2025-09-05 114954.png}
		\caption{chmod使用手册}
		\label{fig:chmod使用手册}
	\end{minipage}
\end{figure}

在我们使用\texttt{man touch}指令后我们即可查看\texttt{touch}指令的使用手册，在阅读完毕后输入q退出，对于\texttt{chmod}，我们重复刚才的操作即可。

\subsection{新建文件和写入}
\begin{questionbox}
    用\texttt{touch}新建一个叫\texttt{semester}的文件，并将文本内容一行一行地写入\texttt{semeter}文件。
\end{questionbox}
在这里我们使用如下命令：
\begin{lstlisting}
    touch semester
    echo '#!/bin/sh'>>semester
    echo 'curl --head --silent https://missing.csail.mit.edu'>>semester
\end{lstlisting}
具体结果如图\ref{fig:新建文件和写入}
\begin{figure}[htb]
	\centering
	\includegraphics[width=\linewidth]{assets/images/屏幕截图 2025-09-06 204140.png}
	\caption{新建文件和写入}
	\label{fig:新建文件和写入}
\end{figure}

在写入过程中遇到了如下问题:
    \begin{lstlisting}
caochun@CAOCHUN:~$ echo "#!/bin/sh">>semeter
-bash: !/bin/sh: event not found
\end{lstlisting}
问题原因是在\texttt{Bash}中，! 是一个特殊字符，用于调用和执行之前输入过的命令（历史命令）。如
\begin{itemize}
    \item \texttt{!!} 表示重复上一条命令。
    \item \texttt{!ls} 表示执行最近一条以 \texttt{ls} 开头的命令。
\end{itemize}

当我们输入 \texttt{\#!/bin/sh} 时，Bash 会尝试将 ! 后面的内容（即 \texttt{/bin/sh}）解释为一个历史命令的引用。由于您的命令历史中没有以 \texttt{\#!/bin/sh} 开头的命令，\texttt{Bash} 就报错：\texttt{event not found}。\\
我们有两种解决方法：
\begin{itemize}
    \item 像上面命令一样，用\texttt{''}将我们的文本内容框起来而不是\texttt{""}；
    \item 在\texttt{\#}前面加上\texttt{\textbackslash}进行转义。
\end{itemize}

解决了上面的问题，我们接下来回到正题。我们首先\texttt{ls}查看当前目录下的文件，从图\ref{fig:新建文件和写入}中可知，当前目录下是没有名为\texttt{semester}的文件的，接着\texttt{touch semester}创建一个名为\texttt{semester}的文件，然后通过\texttt{echo}命令逐行向\texttt{semester}输入文本。然后通过\texttt{cat}查看\texttt{semester}文件中的文本内容，然后通过\texttt{ls}命令查看当前目录下的文件，由图\ref{fig:新建文件和写入}可知，我们成功新建文件并写入指定文本内容。
\subsection{执行文件和改变权限}
\begin{questionbox}
    尝试执行\texttt{semester}文件，出现了什么问题并尝试通过\texttt{chmod}命令改变权限的方式来解决。
\end{questionbox}

当我们输入：
\begin{lstlisting}
    ./semester
\end{lstlisting}
出现了如下的问题：
\begin{lstlisting}
caochun@CAOCHUN:~$ ./semester
-bash: ./semester: Permission denied
\end{lstlisting}
这表明我们没有执行这个文件的权限。通过如下命令可以查看文件的权限：
\begin{lstlisting}
caochun@CAOCHUN:~$ ls -l semester
-rw-r--r-- 1 caochun caochun 61 Sep  6 20:41 semester
\end{lstlisting}
在显示的内容中没有\texttt{x}字符，表明这个文件没有运行权限。这个时候我们就需要通过\texttt{chmod}命令来修改文件的权限了。输入下面的命令：
\begin{lstlisting}
    chmod +x semester
\end{lstlisting}
这个时候在通过\texttt{ls -l semester}来查看semester文件的权限，并尝试运行，结果如图\ref{执行文件和修改权限}
\begin{figure}[htb]
	\centering
	\includegraphics[width=\linewidth]{assets/images/屏幕截图 2025-09-06 212743.png}
	\caption{执行文件和修改权限}
	\label{执行文件和修改权限}
\end{figure}

我们这个时候发现文件权限显示可以运行，同时也成功执行出我们想要的结果。

\subsection{管道和重定向}
\begin{questionbox}
    使用 | 和 > ，将 semester 文件输出的最后更改日期信息，写入主目录下的 last-modified.txt 的文件中
\end{questionbox}
在这里我们使用如下命令：
\begin{lstlisting}
    stat -c %y semester | head -c 19 > ~/last-modified.txt
\end{lstlisting}
这个命令的作用如下：
\begin{itemize}
    \item \texttt{stat -c \%y semester}：输出\texttt{semester}最后修改时间
    \item \texttt{head -c 19}:只取前 19 个字符，即 年-月-日 时:分:秒，去掉后面的 .纳秒 时区
    \item \texttt{> ~/last-modified.txt}:将前面命令的输出重定向到主目录下的\texttt{ last-modified.txt }文件中（覆盖写入）
\end{itemize}

结果如图\ref{管道和重定向的使用}
\begin{figure}[htb]
	\centering
	\includegraphics[width=\linewidth]{assets/images/屏幕截图 2025-09-07 101629.png}
	\caption{管道和重定向的使用}
	\label{管道和重定向的使用}
\end{figure}

在输入上面的指令后，我们首先使用\texttt{ls}命令，发现在当前目录下多出来一个\texttt{last-modify.txt}文件，然后使用\texttt{cat}指令查看该文件内容。最后的结果都符合我们的预期。

